package com.wsd.music.controller;

import com.wsd.music.entity.Song;
import com.wsd.music.service.SongService;
import com.wsd.music.utils.Message;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import javax.annotation.Resource;
import java.io.File;
import java.io.IOException;

@RestController
@RequestMapping("/song")
public class SongController {

    @Resource
    private SongService service;

    /**
     * 上传歌曲
     * @param file
     * 前端上传的音乐文件
     * @param song
     * 歌曲描述信息
     * @return
     */
    @PostMapping("/insert")
    public Object addSong(Song song, MultipartFile file) {
        if (null == song || null == file) {
            System.out.println("null == song  " + (null == song));
            System.out.println("null == file  " + (null == file));
            return Message.simpleMessage("0", "上传失败");
        }
        String fileName = System.currentTimeMillis() + file.getOriginalFilename();
        // G:\Java\music\song
        String filepath = System.getProperty("user.dir") +
                System.getProperty("file.separator") + "song";

        // 判断目录是否存在
        File path = new File(filepath);
        if (!path.exists()) path.mkdir();

        // 文件实际地址
        File desk = new File(filepath + System.getProperty("file.separator") + fileName);

        try {
            file.transferTo(desk);
        } catch (IOException e) {
            return Message.simpleMessage("0", "上传失败");
        }

        song.setUrl(System.getProperty("file.separator") + "song" + System.getProperty("file.separator") + fileName);
        return service.insert(song) ?
                Message.simpleMessage("1", "歌曲上传成功"):
                Message.simpleMessage("0", "歌曲上传失败");
    }

    /**
     * 根据歌手ID查询歌曲
     * 不带歌词
     * @param id
     * @return
     */
    @GetMapping("/sid")
    public Object selectBySingerId(Integer id, boolean withLyric) {
        return service.selectSongsBySingerId(id, withLyric);
    }

    /**
     * 根据歌曲Id获取到歌曲信息
     * @param id
     * @return
     */
    @GetMapping("/song")
    public Object selectSongInfoBySongId(Integer id) {
        return service.selectById(id, false);
    }

    /**
     * 通过歌曲名查询歌曲
     * @param name
     * @return
     */
    @GetMapping("/accurate/song")
    public Object selectSongIdBySongName(String name) {
        return service.selectBySongName(name);
    }

    /**
     * 接收上传的歌曲图片文件，将文件放入文件夹并修改数据库信息
     * @param avatar
     * @param id
     * @return
     */
    @PostMapping("/updateSongPic")
    public Object updateSongPic(@RequestParam("file") MultipartFile avatar, Integer id) {
        if (null != avatar && null != id) {
            String fileName = System.currentTimeMillis() + avatar.getOriginalFilename();
            // G:\Java\music\img\singerPic
            String filePath = System.getProperty("user.dir") +
                    System.getProperty("file.separator") +
                    "img" +
                    System.getProperty("file.separator") +
                    "songPic";

            // File类代表磁盘文件本身，操作目录和文件都可以通过File来完成
            File file = new File(filePath);
            if (!file.exists()) {
                // 如果不存在该文件夹，创建一个新的文件夹
                file.mkdir();
            }
            // 实际文件地址
            // G:\Java\music\img\singerPic\{fileName}
            File desk = new File(filePath + System.getProperty("file.separator") + fileName);
            // 将文件存储到指定目录
            try {
                avatar.transferTo(desk);
            } catch (IOException e) {
                return Message.simpleMessage("0", e.getMessage());
            }

            // 更新数据库中的文件
            Song song = new Song();
            song.setId(id);
            song.setPic("img" +
                    System.getProperty("file.separator") +
                    "songPic"+
                    System.getProperty("file.separator") +
                    fileName);
            return service.modify(song) ?
                    Message.simpleMessage("1", "添加成功") :
                    Message.simpleMessage("0", "添加失败");
        }
        return null;
    }


    /**
     * 更新歌曲
     * @return
     */
    @PostMapping("/updateSongUrl")
    @Transactional
    public Object updateSongUrl(@RequestParam("file") MultipartFile songFile, Integer id) {
        if (null != songFile && null != id) {

            String fileName = System.currentTimeMillis() + songFile.getOriginalFilename();
            // G:\Java\music\img\singerPic
            String filePath = System.getProperty("user.dir") +
                    System.getProperty("file.separator") +
                    "song";

            // File类代表磁盘文件本身，操作目录和文件都可以通过File来完成
            File file = new File(filePath);
            if (!file.exists()) {
                // 如果不存在该文件夹，创建一个新的文件夹
                file.mkdir();
            }
            // 实际文件地址
            // G:\Java\music\img\singerPic\{fileName}
            File desk = new File(filePath + System.getProperty("file.separator") + fileName);
            // 将文件存储到指定目录
            try {
                songFile.transferTo(desk);
            } catch (IOException e) {
                return Message.simpleMessage("0", e.getMessage());
            }

            // 更新数据库中的文件
            Song song = new Song();
            song.setId(id);
            song.setUrl("song"+
                    System.getProperty("file.separator") +
                    fileName);
            return service.modify(song) ?
                    Message.simpleMessage("1", "添加成功") :
                    Message.simpleMessage("0", "添加失败");
        }
        return null;
    }
}
